import { Models } from '../common/typings/model'
import { Success, HttpException } from '../core/HttpException'
import logger from './logs'
const catchError = async (ctx: Models.Ctx, next: Function) => {
  const method = ctx.method
  try {
    await next()
  } catch (error: any) {
    // 需要返回的信息
    // HTTP Status Code
    // message
    // error_code 详细错误，开发者自己定义
    // 错误类型：已知错误、未知错误

    // 当前错误是否是我们自定义的Http错误
    const isHttpException = error instanceof HttpException

    // 如果不是, 则抛出错误
    if (!isHttpException) {
      logger.error(method, ctx.response.status, ctx.originalUrl, error)
      ctx.body = {
        msg: '未知错误',
        errorCode: 9999,
        requestUrl: `${ctx.method} ${ctx.path}`,
      }
      ctx.status = 500
    }
    // 如果是已知错误
    else {
      if (error.responseType) {
        ctx.response.type = error.responseType
      }
      // 如果是文件流，则直接返回文件
      if (error.isBuffer) {
        ctx.body = error.data
      } else {
        ctx.body = {
          msg: error.message,
          errorCode: error.errorCode,
          data: error.data,
        }
      }

      ctx.status = error.code
      if (error instanceof Success) {
        logger.info(method, ctx.response.status, ctx.originalUrl)
      } else {
        logger.error(method, ctx.response.status, ctx.originalUrl, error)
      }
    }
  }
}
export { catchError }
